package com.szholly.plug.arcgis.controller;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.szholly.utils.spring.SpringBeanFactory;

/**
 * 定义GIS配置控制器
 */
@Controller
public class ArcGISProxyController {

	/**
	 * ArcGIS下的WMS和WMTS的代理
	 * 
	 * @param request
	 * @param response
	 */
	@RequestMapping(value = "/gis/proxy.do")
	public void proxy(HttpServletRequest request, HttpServletResponse response) {
		ArcGISProxyParameter proxyParameter = (ArcGISProxyParameter) SpringBeanFactory
				.getBean("arcGISProxyParameter");
		
		String[] serverUrls = proxyParameter.getServerUrls();
		try {
			String reqUrl = request.getQueryString();
			boolean allowed = false;
			String token = null;
			for (String surl : serverUrls) {
				String[] stokens = surl.split("\\s*,\\s*");
				if (reqUrl.toLowerCase().contains(stokens[0].toLowerCase())) {
					allowed = true;
					if (stokens.length >= 2 && stokens[1].length() > 0)
						token = stokens[1];
					break;
				}
			}
			if (!allowed) {
				response.setStatus(403);
				return;
			}
			if (token != null) {
				reqUrl = reqUrl + (reqUrl.indexOf("?") > -1 ? "&" : "?")
						+ "token=" + token;
			}
			URL url = new URL(reqUrl);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			con.setDoOutput(true);
			con.setRequestMethod(request.getMethod());
			if (request.getContentType() != null) {
				con.setRequestProperty("Content-Type", request.getContentType());
			}
			int clength = request.getContentLength();
			if (clength > 0) {
				con.setDoInput(true);
				InputStream istream = request.getInputStream();
				OutputStream os = con.getOutputStream();
				final int length = 10000;
				byte[] bytes = new byte[length];
				int bytesRead = 0;
				while ((bytesRead = istream.read(bytes, 0, length)) > 0) {
					os.write(bytes, 0, bytesRead);
				}
			}

			OutputStream ostream = response.getOutputStream();
			response.setContentType(con.getContentType());
			InputStream in = con.getInputStream();
			final int length = 10000;
			byte[] bytes = new byte[length];
			int bytesRead = 0;
			while ((bytesRead = in.read(bytes, 0, length)) > 0) {
				ostream.write(bytes, 0, bytesRead);
			}
		} catch (Exception e) {
			response.setStatus(500);
		}
	}
}